/*
 * NodoIndice.h
 *
 *  Created on: 03/04/2010
 *      Author: administrador
 */

#ifndef NODOINDICE_H_
#define NODOINDICE_H_

#include "INodo.h"
#include "NodoHoja.h"

class NodoIndice: public INodo {

private:

	/* claves de los elementos en los nodos hijos */
	vector<Clave> clavesElementos;

	/* id de los nodos hijos */
	vector<int> idNodos;

	/* Verifica y sino modifica el separador correspondiente al nodo hijo */

	void solucionarOverflow(INodo* nodoEnOverflow);

	void solucionarUnderflow(INodo* nodoEnUnderflow);

	void actualizarSeparador(Clave separador, int idNodoDerechoSeparador);


public:

	Clave verificarSeparador();
	NodoIndice(int nivel, int idNodo = -1, char tipo = Comun);

	virtual ~NodoIndice();

	Clave getClaveElemento(int posicion);

	int getIdNodo(int posicion);

	/* Agrega clave al final del vector clavesElementos */
	void agregarClaveElemento(Clave clave);

	/* Agrega id al final del vector idNodos */
	void agregarIdNodo(int id);

	/* Agrega el id del nodo nuevo y la clave de su primer elemento */
	void agregarIdNodoNuevoYclaveElemento(int id, Clave clave);

	/* Borra el id del nodo hijo y la clave de su primer elemento */
	void borrarIdNodoNuevoYclaveElemento(int id);

	/* Retorna el id del nodo hijo donde encontrar el elemento con clave pasada por parametro */
	int buscarNodoParaClave(Clave clave);

	void vaciarNodo();

	bool insertarElemento(Elemento* elemento);

	bool quitarElemento(Clave clave);

	bool modificarElemento(Clave clave, string* valor);

	Elemento* buscarElemento(Clave clave);

	/* Retorna el primer elemento del primer nodo hoja de la rama */
	Elemento* obtenerPrimerElementoDelPrimerNodo();

	Elemento* primerElemento();

	void partirNodoEnOverflow(Clave &claveAPromover, INodo* nodoNuevo);

	Clave buscarClave(int idNodoIzq);

	bool balancearNodoEnUnderflow(Clave clavePadre,INodo* nodoHermano);

	bool fusionarNodoEnUnderflow(Clave clavePadre, INodo* nodoHermano);

	INodo* obtenerHermanoIzquierdo(INodo* nodo);

	INodo* obtenerHermanoDerecho(INodo* nodo);

	bool tieneHermanoIzquierdo(INodo* nodo);

	bool tieneHermanoDerecho(INodo* nodo);

	void printNodo(ofstream* archivoSalida,int cantidadNiveles);

	void serializar();

	void hidratar();
};

#endif /* NODOINDICE_H_ */
